perm filename CHK[AP,SYS]5 blob sn#018563 filedate 1973-01-04 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	Definitions.
C00003 00003	Storage allocations.
C00005 00004	Beginning of main program.
C00007 00005	Read in data files.
C00009 00006	Continue reading in the data files.
C00011 00007	Main loop.
C00013 00008	Final checks.
C00015 00009	Subroutines: MARK,PRINT.
C00016 00010	Subroutines: CKMLT,CKMLT2,CKLNKS.
C00018 ENDMK
C⊗;
;Definitions.

	TITLE	CHK

EXTERN DDT,$I,JOBREL,JOBFF,JOBSA,JOBDDT

AC1←1
AC2←2
AC3←3
AC4←4
DICTWD←5
LAST←6
NEXT←7
CNT←10
ADR←11
QUO←12
REM←13
BPTR←14
MULT←15
MULT1←16
P←17

CR←←15	LF←←12

DEFINE ERRMSG(MSG,INS)
       {JRST   [OUTSTR	[ASCIZ\
MSG
\]
		SKIPN	JOBDDT
		CALLI	1,12
		JSR	$I
		INS		]}

DEFINE ERRXIT(MSG)
       {JRST   [OUTSTR	[ASCIZ\
MSG
\]
		CALLI	1,12]}
;Storage allocations.

PDLEN←←40
PDLIST:	BLOCK	PDLEN

DICT:	XWD	DICTWD,0
	XWD	DICTWD,0
	XWD	DICTWD,0
BACK:	XWD	MULT,0
LINKS:	XWD	NEXT,0
WORDS:	XWD	AC1,0
USETBL:	XWD	AC1,0
DSK17:	17
	SIXBIT	/DSK/
	0
CMD:	BLOCK	2

DICTF:	SIXBIT	/DICT/
	BLOCK	3
LINKSF:	SIXBIT	/LINKS/
	BLOCK	3
WORDSF:	SIXBIT	/WORDS/
	BLOCK	3
ERRORF:	SIXBIT	/ERRORS/
	BLOCK	3

DIGITS:	BLOCK	5
SLINKS:	0			;SIZE OF THE LINKS FILE
TBLSIZ:	0			;SIZE OF USETBL
USEEND:	0
SAVEAC:	0
SDICT:	0			;SIZE OF THE DICT FILE
MINMLT:	0			;SMALLEST MULT PTR FOUND
MLTSTT:	0			;RELATIVE LOCATION OF START OF MULT PART OF DICT
LOCMIN:	0			;DICT ENTRY CORRESPONDING TO MINMLT
;Beginning of main program.

CHK:	MOVE	P,[IOWD PDLEN,PDLIST]
	CALLI					;RESET
	OUTSTR	[ASCIZ/
/]
	HRRZ	AC2,JOBFF
	CALLI	AC2,11				;CORE
	ERRXIT	{CORE UUO FAILED: RESET}
	OPEN	17,DSK17
	ERRXIT	{OPEN FAILED ON DSK: ERRORS}
	SETZM	ERRORF+3
	LOOKUP	17,ERRORF
	OUTSTR	[ASCIZ/NO /]
	RELEAS	17,
	OUTSTR	[ASCIZ/ERRORS
/]

	MOVE	BPTR,[POINT 6,AC2]
	OUTSTR	[ASCIZ /EXTS? /]
	MOVEI	CNT,3
	SETZ	AC2,
NXCH:	INCHRW	AC1
	CAIN	AC1,CR
	JRST	PUTEXT
	CAIN	AC1,LF
	JRST	PUTEX1
	SOJL	CNT,NXCH
	TRZ	AC1,40	
	TRZE	AC1,100
	TRO	AC1,40
	IDPB	AC1,BPTR
	JRST	NXCH
PUTEXT:	INCHRW	AC1			;READ THE LF AFTER THE CR
PUTEX1:	MOVEM	AC2,DICTF+1
	MOVEM	AC2,LINKSF+1
	MOVEM	AC2,WORDSF+1
;Read in data files.

AGAIN1:	OPEN	1,DSK17
	ERRXIT	{CANT OPEN THE DSK: DICT}
	SETZM	DICTF+3
	LOOKUP	1,DICTF
	JRST	[RELEAS 1,
		 OUTCHR	["-"]
		 MOVEI	AC1,1
		 CALLI	AC1,31			;SLEEP
		 JRST	AGAIN1]
	OUTSTR	[ASCIZ /+
/]
	HLRE	AC1,DICTF+3
	TRNE	AC1,177
	ERRMSG	{DICT DOES NOT END ON RECORD BOUNDARY},JRST .+1
	MOVNM	AC1,SDICT			;save size of DICT file
	MOVE	AC2,JOBREL
	HRRZM	AC2,CMD
	HRLM	AC1,CMD
	ADDI	AC2,1
	HRRM	AC2,DICT			;set up DICT indirect pointers
	ADDI	AC2,1
	HRRM	AC2,DICT+1
	ADDI	AC2,1
	HRRM	AC2,DICT+2
	HRRM	AC2,BACK
	SUBI	AC2,2				;readjust AC2 to pt to first wd of DICT
	SUB	AC2,AC1
	HRRM	AC2,LINKS			;set up LINKS indirect ptr
	CALLI	AC2,11				;CORE
	ERRXIT	{CORE UUO FAILED: DICT}
	IN	1,CMD
	JRST	.+2
	ERRXIT	{IN UUO FAILED: DICT}
	RELEAS	1,
	OPEN	1,DSK17
	ERRXIT	{CANT OPEN THE DSK: LINKS}
	SETZM	LINKSF+3
	LOOKUP	1,LINKSF
	ERRXIT	{LOOKUP FAILED: LINKS}
	HLRE	AC1,LINKSF+3
	MOVNM	AC1,SLINKS			;save size of LINKS file
	HRRZ	AC2,LINKS
	AOS	LINKS				;correct LINKS indirect ptr
	HRRZM	AC2,CMD
	HRLM	AC1,CMD
	SUB	AC2,AC1
	HRRM	AC2,WORDS			;set up WORDS indirect ptr
	CALLI	AC2,11				;CORE
	ERRXIT	{CORE UUO FAILED: LINKS}
	IN	1,CMD
	JRST	.+2
	ERRXIT	{IN UUO FAILED: LINKS}
	RELEAS	1,
;Continue reading in the data files.

	OPEN	1,DSK17
	ERRXIT	{CANT OPEN THE DSK: WORDS}
	SETZM	WORDSF+3
	LOOKUP	1,WORDSF
	ERRXIT	{LOOKUP FAILED: WORDS}
	HLRE	AC1,WORDSF+3
	HRRZ	AC2,WORDS
	AOS	WORDS				;correct WORDS indirect ptr
	HRRZM	AC2,CMD
	HRLM	AC1,CMD
	SUB	AC2,AC1
	HRRM	AC2,USETBL			;set up USETBL indirect ptr
	CALLI	AC2,11				;CORE
	ERRXIT	{CORE UUO FAILED: WORDS}
	IN	1,CMD
	JRST	.+2
	ERRXIT	{IN UUO FAILED: WORDS}
	RELEAS	1,
	HRRZ	AC2,USETBL
	AOS	USETBL				;correct USETBL indirect ptr
	MOVE	AC1,SLINKS
	TRNE	AC1,77
	ADDI	AC2,100
	ASH	AC1,-6
	MOVEM	AC1,TBLSIZ
	SOS	TBLSIZ
	ADD	AC2,AC1
	HRRZM	AC2,USEEND
	CALLI	AC2,11				;CORE
	ERRXIT	{CORE UUO FAILED: USETBL}
	HRRZ	AC1,USETBL
	HRLZI	AC2,740000
	MOVEM	AC2,(AC1)
	HRL	AC1,AC1
	ADDI	AC1,1
	BLT	AC1,@USEEND

	HRRZ	AC2,USEEND
	HRRM	AC2,JOBFF
;Main loop.

	SETZM	MLTSTT
	MOVEI	MULT,-1
	MOVEM	MULT,MINMLT
	SETZM	USED#
	SETZ	DICTWD,

NXTDWD:	ADDI	DICTWD,2
	HLRZ	AC1,@DICT
	MOVE	AC4,@WORDS
	CAMN	AC4,[77B6]
	JRST	MULTS
	PUSHJ	P,CKMLT
	PUSHJ	P,CKLNKS
	JRST	NXTDWD

MULTS:	ADDI	DICTWD,2
	TRZE	DICTWD,177
	ADDI	DICTWD,200
	MOVEM	DICTWD,MLTSTT

NXTMLT:	PUSHJ	P,CKMLT
	HRRE	MULT,@DICT+2
	PUSHJ	P,CKMLT2
	PUSHJ	P,CKLNKS
	ADDI	DICTWD,3
CHKREC:	SKIPE	@DICT
	JRST	NXTMLT
	ADDI	DICTWD,2
	TRNN	DICTWD,177
	JRST	CHKREC
;Final checks.

	MOVE	AC1,MINMLT
	MOVE	ADR,LOCMIN
	CAMGE	AC1,MLTSTT
	ERRMSG	{MULT PTR POINTS TO MAIN PART OF DICT, NOT MULT PART},JRST .+1
	SETO	CNT,
	SETZ	NEXT,
NXTFRE:	ADDI	CNT,1
	CAML	NEXT,SLINKS
	ERRMSG	{PTR TO NEXT AVAIL SLOT IS OUT OF RANGE},JRST AOOR
	PUSHJ	P,MARK
	MOVE	NEXT,@LINKS
	TLZE	NEXT,-1
	ERRMSG	{NON-ZERO LEFT HALF OF AVAIL SLOT},JRST .+1
	JUMPN	NEXT,NXTFRE
AOOR:	MOVEM	CNT,FREE#

;Calculate locations of unreachable slots.

	SETZ	AC1,
NXTWD:	AOSN	AC2,@USETBL
	JRST	GETWD
	SUBI	AC2,1
	SETCA	AC2,
	SETZ	CNT,
	JRST	BOT
TOP:	ADDI	CNT,1(AC3)
	LSH	AC2,1(AC3)
	MOVE	ADR,AC1
	ASH	ADR,6
	ADDI	ADR,=72
	SUB	ADR,CNT
	SUB	ADR,CNT
	CAMGE	ADR,SLINKS
	ERRMSG	{LOST SLOT (ADR)},JRST .+1
BOT:	JFFO	AC2,TOP
GETWD:	CAMGE	AC1,TBLSIZ
	AOJA	AC1,NXTWD
	CALLI	0		;RESET PAGE PRINTER
	OUTSTR	[ASCIZ /
/]
	MOVE	QUO,FREE
	PUSHJ	P,PRINT
	OUTSTR	[ASCIZ / SLOTS LEFT IN AVAIL LIST
/]
	MOVE	QUO,USED
	PUSHJ	P,PRINT
	OUTSTR	[ASCIZ / SLOTS TOTAL
/]
	CALLI	1,12		;EXIT
	JRST	CHK
;Subroutines: MARK,PRINT.

MARK:	LDB	AC1,[POINT 12,NEXT,29]	;get adr of marking word
	LDB	AC2,[POINT 5,NEXT,34]	;get shift amount
	MOVEI	AC3,1
	LSH	AC3,(AC2)
	MOVE	AC4,AC3
	AND	AC4,@USETBL
	JUMPE	AC4,MOK			;was this link already marked used
	ERRMSG	{SLOT IN TWO LISTS},{POPJ P,}
MOK:	ORM	AC3,@USETBL		;no.  marOk it now
	AOS	USED
	POPJ	P,

PRINT:	MOVE	BPTR,[POINT 7,DIGITS]
	PUSHJ	P,NXTDG
	SETZ	AC1,
	IDPB	AC1,BPTR
	OUTSTR	DIGITS
	POPJ	P,

NXTDG:	IDIVI	QUO,=10
	PUSH	P,REM
	SKIPE	QUO
	PUSHJ	P,NXTDG
COLLEC:	POP	P,AC1
	ADDI	AC1,60
	IDPB	AC1,BPTR
	POPJ	P,
;Subroutines: CKMLT,CKMLT2,CKLNKS.

CKMLT:	HLRE	MULT,@DICT+1		;check MULT ptr for consistency
CKMLT2:	JUMPE	MULT,CPOPJ
	JUMPG	MULT,.+2
	ERRMSG	{NEGATIVE MULT PTR},{POPJ P,}
	CAML	MULT,SDICT
	ERRMSG	{MULT PTR OUT OF RANGE},{POPJ P,}
	CAMLE	MULT,MINMLT
	JRST	CKMLT1
	CAML	MULT,MINMLT
	ERRMSG	{TWO MULT PTRS POINT TO SAME MULT ENTRY},{POPJ P,}
	MOVEM	MULT,MINMLT
	MOVEM	DICTWD,LOCMIN
CKMLT1:
	HLRE	MULT1,@BACK
	CAME	MULT1,DICTWD
	ERRMSG	{INCORRECT BACK MULT PTR},JRST .+1
	TRZ	MULT,-200
	IDIVI	MULT,3
	JUMPE	MULT+1,CPOPJ
	ERRMSG	{MULT PTR NOT MULTIPLE OF 3},{POPJ P,}
CPOPJ:	POPJ	P,

CKLNKS:	HRRZ	NEXT,@DICT+1		;check story list in LINKS for this keyword
	JUMPE	NEXT,CPOPJ		;zero means no stories contain this keyword
	CAIN	NEXT,-1			;-1 means this is not a legal keyword
	POPJ	P,
	CAML	NEXT,SLINKS
	ERRMSG	{PTR FROM DICT TO LINKS IS OUT OF RANGE},{POPJ P,}
	MOVNM	DICTWD,LAST
NXTLNK:	HRRE	AC2,@LINKS
	CAME	AC2,LAST
	ERRMSG	{INCORRECT BACK PTR FOR DOUBLY LINKED LIST IN LINKS},{POPJ P,}
	PUSHJ	P,MARK
	MOVE	LAST,NEXT
	HLRZ	NEXT,@LINKS
	CAML	NEXT,SLINKS
	ERRMSG	{PTR TO NEXT SLOT IS OUT OF RANGE (SINGLE)},{POPJ P,}
	JUMPN	NEXT,NXTLNK
	POPJ	P,

	END	CHK